Mobility, Latent Trend and Omega for all states

  1. Mobility trend for all states (\(\phi\)). Covariate that describes human mobility. These data come from Unacast. We smooth the raw data from Unacast using a spline fit, resulting in the trajectories of human movement shown below. This covariate is used to reduce baseline transmission. Here we show the mobility trends from all 50 states. b) latent trend for all states (\(\psi\)). c) Relativie transmissibility (\(\omega\)) for all states. In each subplot, the read line is a non-weighted mean of all states.

Correlation between Omega and Prevalence

  1. predictor = omega(t); response = daily prevalence(t)


California, and mean across states, at varying lags


  1. predictor = AUC of omega over time; response = cumulative all infections over time

  1. predictor = AUC of omega; response = cumulative all infections


  1. map of same (correlation, by state)

To be made

Correlation between Mobility and Omega

LS0tCnRpdGxlOiAiRmlndXJlcyIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogRXJpYyBNYXJ0eQotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGU9VFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgb3V0LndpZHRoID0gIjEwMCUiKQpsaWJyYXJ5KGhlcmUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkoeWFyZHN0aWNrKQojIGxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdnc3RhdHNwbG90KQpgYGAKCmBgYHtyIGRhdGF9CmFsbF9maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSBoZXJlKCJvdXRwdXQvY3VycmVudC8iKSwgcGF0dGVybiA9ICIuY3N2IikKcGFyYW1fZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gaGVyZSgib3V0cHV0L2N1cnJlbnQvIiksIHBhdHRlcm4gPSAicGFyYW1zLW5hdHVyYWwucmRzIikKc3RhdGVfc3VtbWFyaWVzIDwtIHRpYmJsZSgpCnN0YXRlX3BhcmFtZXRlcnMgPC0gdGliYmxlKCkKc3RhdGVfbG9nbGlrcyA8LSB0aWJibGUoKQpzdGF0ZWRmIDwtcmVhZFJEUyhoZXJlKCJvdXRwdXQvY3VycmVudCIsICJzdGF0ZWRmLnJkcyIpKQpmb3IoaSBpbiAxOmxlbmd0aChhbGxfZmlsZXMpKSB7CiAgZG9fZmlsZSA8LSBhbGxfZmlsZXNbaV0KICBsb2NhdGlvbiA8LSBzdWIoIi5jc3YiLCAiIiwgZG9fZmlsZSkKICBzdGF0ZV9tZXRhZGF0YSA8LSBzdGF0ZWRmICU+JSBmaWx0ZXIoc3RhdGVfZnVsbCA9PSBzdWIoIi5jc3YiLCAiIiwgZG9fZmlsZSkpCiAgc3RhdGVfcG9wIDwtIHN0YXRlX21ldGFkYXRhICU+JSBwdWxsKHRvdGFsX3BvcCkKICBzdGF0ZV9pbml0UjAgPC0gc3RhdGVfbWV0YWRhdGEgJT4lIHB1bGwoaW5pdFIwKQogIHN0YXRlX2JldGFfcyA8LSAoc3RhdGVfaW5pdFIwKi4xKQogIAogIAogIHRtcGZpbGUgPC0gaGVyZSgib3V0cHV0L2N1cnJlbnQiLCBkb19maWxlKQogIHRtcCA8LSByZWFkLmNzdih0bXBmaWxlKSAlPiUKICAgIGZpbHRlcihzaW1fdHlwZSA9PSAic3RhdHVzX3F1byIgfCBpcy5uYShzaW1fdHlwZSksCiAgICAgICAgICAgdmFyaWFibGUgJWluJSBjKCJkYWlseV9jYXNlcyIsICJkYWlseV9kZWF0aHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0dWFsX2RhaWx5X2Nhc2VzIiwgImFjdHVhbF9kYWlseV9kZWF0aHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibW9iaWxpdHlfdHJlbmQiLCAibGF0ZW50X3RyZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMiLCAiZGFpbHlfYWxsX2luZmVjdGlvbnMiKSkgJT4lCiAgICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSkpICU+JQogICAgZHBseXI6OnNlbGVjdChsb2NhdGlvbiwgc2ltX3R5cGUsIHBlcmlvZCwgZGF0ZSwgdmFyaWFibGUsIG1lYW5fdmFsdWUpICU+JSAKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3ZhbHVlKSAlPiUKICAgIG11dGF0ZShiZXRhX3MgPSBzdGF0ZV9iZXRhX3MpICU+JSAKICAgIG11dGF0ZShwcmV2YWxlbmNlID0gZGFpbHlfYWxsX2luZmVjdGlvbnMgLyBzdGF0ZV9wb3ApICU+JSAKICAgIG11dGF0ZShvbWVnYSA9IG1vYmlsaXR5X3RyZW5kICogbGF0ZW50X3RyZW5kICogYmV0YV9zKSAlPiUgCiAgICBwaXZvdF9sb25nZXIoY29scyA9ICFjKGxvY2F0aW9uLCBzaW1fdHlwZSwgcGVyaW9kLCBkYXRlKSwgCiAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidmFyaWFibGUiLCAKICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWVhbl92YWx1ZSIsCiAgICAgICAgICAgICAgICAgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKQoKICBzdGF0ZV9zdW1tYXJpZXMgPC0gYmluZF9yb3dzKHN0YXRlX3N1bW1hcmllcywgdG1wKSAjID8gd2FzIHRoaXMgbWlzc2luZz8KCiAgdG1wcGFyYW1maWxlIDwtIGhlcmUoIm91dHB1dC9jdXJyZW50IiwgcGFyYW1fZmlsZXNbaV0pCiAgdG1wcGFyYW1zIDwtIHJlYWRSRFModG1wcGFyYW1maWxlKQogIHRtcF9sb2dsaWsgPC0gZGF0YS5mcmFtZShsb2NhdGlvbiA9IHVuaXF1ZSh0bXAkbG9jYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICBsb2dfbGlrID0gdG1wcGFyYW1zWyJMb2dMaWsiLCAyXSkKICBybm1zIDwtIHJvdy5uYW1lcyh0bXBwYXJhbXMpCiAgdG1wcGFyYW1zIDwtIHRtcHBhcmFtcyAlPiUKICAgIG11dGF0ZShwYXJhbWV0ZXIgPSBybm1zKSAlPiUKICAgIGZpbHRlcihpc19maXR0ZWQgPT0gInllcyIpICU+JQogICAgZHBseXI6OnNlbGVjdCgtaXNfZml0dGVkKSAlPiUKICAgIGdhdGhlcigia2V5IiwgInZhbHVlIiwgLXBhcmFtZXRlcikgJT4lCiAgICBmaWx0ZXIoa2V5ID09ICJYMSIpICU+JQogICAgZHBseXI6OnNlbGVjdCgta2V5KSAlPiUKICAgIG11dGF0ZShsb2NhdGlvbiA9IHVuaXF1ZSh0bXAkbG9jYXRpb24pKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIHZhbHVlLCBwYXJhbWV0ZXIpCiAgCiAgc3RhdGVfcGFyYW1ldGVycyA8LSBiaW5kX3Jvd3Moc3RhdGVfcGFyYW1ldGVycywgdG1wcGFyYW1zKQogIHN0YXRlX2xvZ2xpa3MgPC0gYmluZF9yb3dzKHN0YXRlX2xvZ2xpa3MsIHRtcF9sb2dsaWspCn0KCiMgRml4ZWQgcGFyYW1ldGVycyB0YWJsZQpiZXRhc19uYW1lcyA8LSBybm1zW2dyZXAoImJbMC05XSsiLCBybm1zKV0gIyBmaW5kIHBhcmFtZXRlcnMgc3RhcnRpbmcgd2l0aCBiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIKc3BsaW5lX2NvZWZmaWNpZW50cyA8LSBwYXN0ZSgiU3BsaW5lIGNvZWZmaWNpZW50IiwgZ3N1YigiYiIsIiIsIGJldGFzX25hbWVzKSkKbmFtZXMoc3BsaW5lX2NvZWZmaWNpZW50cykgPC0gYmV0YXNfbmFtZXMKCnBhcmFtc192ZWMgPC0gYyhNSUZfSUQgPSAiTUlGIGlkIiwgCiAgICAgICAgICAgICAgICBMb2dMaWsgPSAiTG9nIExpa2VsaWhvb2QiLCAKICAgICAgICAgICAgICAgIExvZ0xpa19TRSA9ICJTRSBvZiBMb2cgTGlrZWxpaG9vZCIsIAogICAgICAgICAgICAgICAgYmV0YV9zID0gIlRyYW5zbWlzc2lvbiByYXRlIiwKICAgICAgICAgICAgICAgICMgUmVsYXRpdmUgVHJhbnNtaXNzaWJpbGl0eQogICAgICAgICAgICAgICAgZnJhY190cmFuc19lID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgbGF0ZW50IGluZmVjdGlvbnMiLAogICAgICAgICAgICAgICAgZnJhY190cmFuc19hID0gIlJlbGF0aXZlIHRyYW5zbWlzc2liaWxpdHkgb2YgYXN5bXB0b21hdGljIGluZGl2aWR1YWxzIiwKICAgICAgICAgICAgICAgIGZyYWNfdHJhbnNfYyA9ICJSZWxhdGl2ZSB0cmFuc21pc3NpYmlsaXR5IG9mIGRldGVjdGVkIHN5bXB0b21hdGljIGluZGl2aWR1YWxzIHBvc3QtcmVwb3J0aW5nIiwKICAgICAgICAgICAgICAgIGZyYWNfdHJhbnNfaCA9ICJSZWxhdGl2ZSB0cmFuc21pc3NpYmlsaXR5IG9mIGhvc3BpdGFsaXplZCBpbmRpdmlkdWFscyIsCiAgICAgICAgICAgICAgICAjIFRpbWUgaW4gY29tcGFydG1lbnRzCiAgICAgICAgICAgICAgICB0aW1lX2UgPSAiVGltZSBzcGVudCBpbiBsYXRlbnQgY29tcGFydG1lbnRzIChkYXlzKSIsCiAgICAgICAgICAgICAgICB0aW1lX2EgPSAiVGltZSBzcGVudCBpbiBhc3ltcHRvbWF0aWMgY29tcGFydG1lbnRzIChkYXlzKSIsCiAgICAgICAgICAgICAgICB0aW1lX3N1ID0gIlRpbWUgc3BlbnQgaW4gc3ltcHRvbWF0aWMsIHVuZGV0ZWN0ZWQgY29tcGFydG1lbnRzIChkYXlzKSIsCiAgICAgICAgICAgICAgICB0aW1lX3NkID0gIlRpbWUgc3BlbnQgaW4gc3ltcHRvbWF0aWMsIGRldGVjdGVkIGNvbXBhcnRtZW50cyAoZGF5cykiLAogICAgICAgICAgICAgICAgdGltZV9jID0gIlRpbWUgc3BlbnQgaW4gZGlhZ25vc2VkIGNhc2VzIGNvbXBhcnRtZW50cyAoZGF5cykiLAogICAgICAgICAgICAgICAgdGltZV9oID0gIlRpbWUgc3BlbnQgaW4gaG9zcGl0YWxpemVkIGNvbXBhcnRtZW50cyAoZGF5cykiLAogICAgICAgICAgICAgICAgIyBEZXRlY3Rpb24gdGltZQogICAgICAgICAgICAgICAgbWF4X2RpYWdfZmFjdG9yID0gIk1heGltdW0gZm9yIGZhY3RvciBieSB3aGljaCBtb3ZlbWVudCB0aHJvdWdoIElzZCBoYXBwZW5zIGZhc3RlciAocXVpY2tlciBkaWFnbm9zaXMpIiwKICAgICAgICAgICAgICAgIGRpYWdfcmFtcHVwID0gIlJhdGUgYXQgd2hpY2ggZmFzdGVyIGRpYWdub3NpcyByYW1wcyB1cCB0byBtYXgiLAogICAgICAgICAgICAgICAgdF9oYWxmX2RpYWcgPSAiVGltZSBhdCB3aGljaCBkaWFnbm9zaXMgaXMgYXQgNTAlIG9mIG1heCAoaW4gZGF5cyBzaW5jZSB0ID0gMSkiLAogICAgICAgICAgICAgICAgIyBEZXRlY3Rpb24gZnJhY3Rpb24KICAgICAgICAgICAgICAgIG1heF9kZXRlY3RfZnJhYyA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGNhc2VzIHRoYXQgYXJlIGRldGVjdGVkIiwKICAgICAgICAgICAgICAgIGRldGVjdF9yYW1wdXAgPSAiU3BlZWQgYXQgd2hpY2ggZnJhY3Rpb24gZGV0ZWN0ZWQgcmFtcHMgdXAiLAogICAgICAgICAgICAgICAgdF9oYWxmX2RldGVjdCA9ICJUaW1lIGF0IHdoaWNoIGluZmVjdGlvbiBkZXRlY3Rpb24gZnJhY3Rpb24gaXMgYXQgNTAlIG9mIG1heCAoaW4gZGF5cyBzaW5jZSB0ID0gMSkiLAogICAgICAgICAgICAgICAgYmFzZV9kZXRlY3RfZnJhYyA9ICJNaW5pbXVtIGZyYWN0aW9uIGRldGVjdGVkIGF0IHQgPSAxIiwKICAgICAgICAgICAgICAgICMgRnJhY3Rpb24gYXN5bXB0b21hdGljCiAgICAgICAgICAgICAgICBmcmFjX2FzeW0gPSAiRnJhY3Rpb24gb2YgbGF0ZW50IGluZmVjdGlvbnMgdGhhdCBtb3ZlIHRvIGFzeW1wdG9tYXRpYyIsCiAgICAgICAgICAgICAgICAjIEZyYWN0aW9uIGhvc3B0aWxpemVkCiAgICAgICAgICAgICAgICBmcmFjX2hvc3AgPSAiRnJhY3Rpb24gb2YgZGV0ZWN0ZWQgY2FzZXMgdGhhdCBhcmUgaG9zcGl0YWxpemVkIiwKICAgICAgICAgICAgICAgICMgRnJhY3Rpb24gb2YgaG9zcGl0YWxpemF0aW9ucyB0aGF0IHJlc3VsdCBpbiBkZWF0aAogICAgICAgICAgICAgICAgbWluX2ZyYWNfZGVhZCA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGhvc3BpdGFsaXphdGlvbnMgdGhhdCByZXN1bHQgaW4gZGVhdGgiLAogICAgICAgICAgICAgICAgbWF4X2ZyYWNfZGVhZCA9ICJNYXhpbXVtIGZyYWN0aW9uIG9mIGhvc3BpdGFsaXphdGlvbnMgdGhhdCByZXN1bHQgaW4gZGVhdGgiLAogICAgICAgICAgICAgICAgbG9nX2hhbGZfZGVhZCA9ICJUaW1lIGF0IHdoaWNoIGRlYXRoIGZyYWN0aW9uIGlzIGF0IDUwJSBvZiBtYXggKGluIGRheXMgc2luY2UgdCA9IDEpIiwKICAgICAgICAgICAgICAgICMgRGlzcGVyc2lvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICB0aGV0YV9jYXNlcyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgY2FzZSByZXBvcnRpbmcgb2JzZXJ2YXRpb24gcHJvY2VzcyIsCiAgICAgICAgICAgICAgICB0aGV0YV9ob3NwcyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgaG9zcGl0YWxpemF0aW9uIHJlcG9ydGluZyBvYnNlcnZhdGlvbiBwcm9jZXNzIiwKICAgICAgICAgICAgICAgIHRoZXRhX2RlYXRocyA9ICJEaXNwZXJzaW9uIHBhcmFtZXRlciBmb3IgZGVhdGggcmVwb3J0aW5nIG9ic2VyY2F0aW9uIHByb2Nlc3MiLAogICAgICAgICAgICAgICAgc2lnbWFfZHcgPSAiVmFyaWFuY2Ugb2YgdGhlIHN0b2NoYXN0aWNzIHByb2Nlc3Mgbm9pc2UiLAogICAgICAgICAgICAgICAgIyBTcGxpbmUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICBzcGxpbmVfY29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgIyBJbml0aWFsIGNvbmRpdGlvbnMKICAgICAgICAgICAgICAgIFNfMCA9ICJJbml0aWFsIG51bWJlciBvZiBzdXNjZXB0aWJsZSBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBFMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGxhdGVudCBpbmZlY3Rpb3VzIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKICAgICAgICAgICAgICAgIElhMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGFzeW1wdG9tYXRpYyBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBJc3UxXzAgPSAiSW5pdGlhbCBudW1iZXIgb2Ygc3ltcHRvbWF0aWMsIHVuZGV0ZWN0ZWQgaW5kaXZpZHVhbHMgb24gdCA9IDEiLAogICAgICAgICAgICAgICAgSXNkMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIHN5bXB0b21hdGljLCBkZXRlY3RlZCBpbmRpdmlkdWFscyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBDMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGRpYWdub3NlZCBjYXNlcyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBIMV8wID0gIkluaXRpYWwgbnVtYmVyIG9mIGhvc3BpdGFsaXplZCBjYXNlcyBvbiB0ID0gMSIsCiAgICAgICAgICAgICAgICBSXzAgPSAiSW5pdGlhbCBudW1iZXIgb2YgcmVjb3ZlcmVkIGluZGl2aWR1YWxzIG9uIHQgPSAxIiwKICAgICAgICAgICAgICAgIERfMCA9ICJJbml0aWFsIG51bWJlciBvZiBkZWF0aHMgYWZ0ZXIgaG9zcGl0YWxpemF0aW9uIG9uIHQgPSAxIiwKICAgICAgICAgICAgICAgIHRyZW5kX3N0YXJ0ID0gIlRyZW5kIikKCnRtcHBhcmFtcyA8LSByZWFkUkRTKHRtcHBhcmFtZmlsZSkKcm5tcyA8LSByb3cubmFtZXModG1wcGFyYW1zKQpwYXJhbXNfbWFwIDwtIHRpYmJsZShQYXJhbWV0ZXIgPSBuYW1lcyhwYXJhbXNfdmVjKSwKICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPSBwYXJhbXNfdmVjKQpmaXhlZF9wYXJhbWV0ZXJzIDwtIHRtcHBhcmFtcyAlPiUKICBtdXRhdGUoUGFyYW1ldGVyID0gcm5tcykgJT4lCiAgZmlsdGVyKGlzX2ZpdHRlZCA9PSAibm8iKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1pc19maXR0ZWQpICU+JQogIGdhdGhlcigia2V5IiwgInZhbHVlIiwgLVBhcmFtZXRlcikgJT4lCiAgZmlsdGVyKGtleSA9PSAiWDEiKSAlPiUKICBsZWZ0X2pvaW4ocGFyYW1zX21hcCwgYnkgPSAiUGFyYW1ldGVyIikgJT4lCiAgZmlsdGVyKCFQYXJhbWV0ZXIgJWluJSBjKCJNSUZfSUQiLCAiTG9nTGlrIiwgIkxvZ0xpa19TRSIsICJ0cmVuZF9zdGFydCIsICJ0aGV0YV9ob3NwcyIsICJTXzAiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChQYXJhbWV0ZXIsIERlc2NyaXB0aW9uLCB2YWx1ZSkgJT4lCiAgbXV0YXRlKFBhcmFtZXRlciA9IGlmZWxzZShQYXJhbWV0ZXIgPT0gIkUxXzAiLCAiTDFfMCIsIFBhcmFtZXRlcikpCgpmdXR1cmUgPC0gc3RhdGVfc3VtbWFyaWVzICU+JSBmaWx0ZXIocGVyaW9kID09ICJGdXR1cmUiKSAlPiUgcHVsbChkYXRlKSAlPiUgcmFuZ2UoKQpidXJuaW4gPC0gYyhzdGF0ZV9zdW1tYXJpZXMgJT4lIHB1bGwoZGF0ZSkgJT4lIG1pbigpLCBhcy5EYXRlKCIyMDIwLTAyLTI1IikpCgoKYGBgCgojIE1vYmlsaXR5LCBMYXRlbnQgVHJlbmQgYW5kIE9tZWdhIGZvciBhbGwgc3RhdGVzCgphKSBNb2JpbGl0eSB0cmVuZCBmb3IgYWxsIHN0YXRlcyAoJFxwaGkkKS4gQ292YXJpYXRlIHRoYXQgZGVzY3JpYmVzIGh1bWFuIG1vYmlsaXR5LiBUaGVzZSBkYXRhIGNvbWUgZnJvbSA8YSBocmVmPSJodHRwczovL3d3dy51bmFjYXN0LmNvbS8iIHRhcmdldD0iX2JsYW5rIj5VbmFjYXN0PC9hPi4gV2Ugc21vb3RoIHRoZSByYXcgZGF0YSBmcm9tIFVuYWNhc3QgdXNpbmcgYSBzcGxpbmUgZml0LCByZXN1bHRpbmcgaW4gdGhlIHRyYWplY3RvcmllcyBvZiBodW1hbiBtb3ZlbWVudCBzaG93biBiZWxvdy4gVGhpcyBjb3ZhcmlhdGUgaXMgdXNlZCB0byByZWR1Y2UgYmFzZWxpbmUgdHJhbnNtaXNzaW9uLiBIZXJlIHdlIHNob3cgdGhlIG1vYmlsaXR5IHRyZW5kcyBmcm9tIGFsbCA1MCBzdGF0ZXMuIGIpIGxhdGVudCB0cmVuZCBmb3IgYWxsIHN0YXRlcyAoJFxwc2kkKS4gYykgUmVsYXRpdmllIHRyYW5zbWlzc2liaWxpdHkgKCRcb21lZ2EkKSBmb3IgYWxsIHN0YXRlcy4gSW4gZWFjaCBzdWJwbG90LCB0aGUgcmVhZCBsaW5lIGlzIGEgbm9uLXdlaWdodGVkIG1lYW4gb2YgYWxsIHN0YXRlcy4KCmBgYHtyIGNvdmFyaWF0ZSwgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NywgZXZhbCA9IFRSVUV9CmFsbF9waGkgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcih2YXJpYWJsZSA9PSAibW9iaWxpdHlfdHJlbmQiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUocGhpID0gbWVhbl92YWx1ZSkgJT4lIAogIGZpbHRlcihkYXRlIDw9IFN5cy5EYXRlKCkpCgptZWFuX3BoaSA8LSBhbGxfcGhpICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKHBoaSA9IG1lYW4ocGhpKSkKCmdfcGhpIDwtIGdncGxvdChhbGxfcGhpLCBhZXMoeCA9IGRhdGUsIHkgPSBwaGksIGNvbG9yID0gbG9jYXRpb24pKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICAjIHlsYWIoIkh1bWFuIG1vdmVtZW50XG4oJSBvZiBub3JtYWwpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xLCBhbHBoYSA9IC42LCBlbmQgPSAuNzUpICsKICAjIHRoZW1lX2RhcmsoYmFzZV9saW5lX3NpemUgPSAwLjUpICsKICBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fcGhpLCBhbHBoYSA9IC42LCBzaXplID0gMiwgY29sb3IgPSAncmVkJywgbmFtZT0iTWVhbiBvZiBhbGwgc3RhdGVzIikgKwogICMgZ2VvbV9yZWN0KGFlcyh4bWluPWZ1dHVyZVsxXSwgeG1heD1mdXR1cmVbMl0sIHltaW49MCwgeW1heD0xKSkgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGZ1dHVyZVsxXSwgeG1heCA9IGZ1dHVyZVsyXSwgeW1pbiA9IDAsIHltYXggPSAxLCBhbHBoYSA9IC4yKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkKCnBfcGhpIDwtIGdfcGhpICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAjIG1hcmdpbiA9IGxpc3QobCA9IDE1MCksCiAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBoaSIpCiAgICAgICAgICAgICAgICAgKQojIHBfcGhpCmBgYAoKCmBgYHtyfQphbGxfcHNpIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gImxhdGVudF90cmVuZCIpICU+JQogIGRwbHlyOjpzZWxlY3QobG9jYXRpb24sIGRhdGUsIG1lYW5fdmFsdWUpICU+JQogIHJlbmFtZShwc2kgPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fcHNpIDwtIGFsbF9wc2kgJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UocHNpID0gbWVhbihwc2kpKQoKZ19wc2kgPC0gZ2dwbG90KGFsbF9wc2ksIGFlcyh4ID0gZGF0ZSwgeSA9IHBzaSwgY29sb3IgPSBsb2NhdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogICMgeWxhYigiTGF0ZW50IHRyZW5kXG4oJSBvZiBub3JtYWwpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiRCIsIGRpcmVjdGlvbiA9IC0xLCBhbHBoYSA9IC42LCBlbmQgPSAuNzUpICsKICAjIHRoZW1lX2RhcmsoYmFzZV9saW5lX3NpemUgPSAwLjUpICsKICBnZW9tX2xpbmUoZGF0YSA9IG1lYW5fcHNpLCBhbHBoYSA9IC42LCBzaXplID0gMiwgY29sb3IgPSAncmVkJywgbmFtZT0iTWVhbiBvZiBhbGwgc3RhdGVzIikgKwogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IGZ1dHVyZVsxXSwgeG1heCA9IGZ1dHVyZVsyXSwgeW1pbiA9IDAsIHltYXggPSAxLCBhbHBoYSA9IC4yKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkKCnBfcHNpIDwtIGdfcHNpICU+JSBwbG90bHk6OmdncGxvdGx5KCkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAjIG1hcmdpbiA9IGxpc3QobCA9IDE1MCksCiAgICAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBzaSIpCiAgICAgICAgICAgICAgICAgKQojIHBfcHNpCmBgYAoKCmBgYHtyfQphbGxfb21lZ2EgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcih2YXJpYWJsZSA9PSAib21lZ2EiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUob21lZ2EgPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZmlsdGVyKGRhdGUgPD0gU3lzLkRhdGUoKSkKCm1lYW5fb21lZ2EgPC0gYWxsX29tZWdhICU+JSBncm91cF9ieShkYXRlKSAlPiUgc3VtbWFyaXNlKG9tZWdhID0gbWVhbihvbWVnYSkpCgpnX29tZWdhIDwtIGdncGxvdChhbGxfb21lZ2EsIGFlcyh4ID0gZGF0ZSwgeSA9IG9tZWdhLCBjb2xvciA9IGxvY2F0aW9uKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgIyB5bGFiKCJMYXRlbnQgdHJlbmRcbiglIG9mIG5vcm1hbCkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxKSwgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJEIiwgZGlyZWN0aW9uID0gLTEsIGFscGhhID0gLjYsIGVuZCA9IC43NSkgKwogICMgdGhlbWVfZGFyayhiYXNlX2xpbmVfc2l6ZSA9IDAuNSkgKwogIGdlb21fbGluZShkYXRhID0gbWVhbl9vbWVnYSwgYWxwaGEgPSAuNiwgc2l6ZSA9IDIsIGNvbG9yID0gJ3JlZCcsIG5hbWU9Ik1lYW4gb2YgYWxsIHN0YXRlcyIpICsKICBhbm5vdGF0ZSgicmVjdCIsIHhtaW4gPSBmdXR1cmVbMV0sIHhtYXggPSBmdXR1cmVbMl0sIHltaW4gPSAwLCB5bWF4ID0gMSwgYWxwaGEgPSAuMikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpCgpwX29tZWdhIDwtIGdfb21lZ2EgJT4lIHBsb3RseTo6Z2dwbG90bHkoKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQoc2hvd2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICMgbWFyZ2luID0gbGlzdChsID0gMTUwKSwKICAgICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiT21lZ2EiKQogICAgICAgICAgICAgICAgICkKIyBwX29tZWdhCmBgYAoKYGBge3J9CnBsb3RseTo6c3VicGxvdChwX3BoaSwgcF9wc2ksIHBfb21lZ2EsIG5yb3dzID0gMywgc2hhcmVYID0gVFJVRSwgdGl0bGVZID0gVFJVRSkKYGBgCgojIENvcnJlbGF0aW9uIGJldHdlZW4gT21lZ2EgYW5kIFByZXZhbGVuY2UKCmEpIHByZWRpY3RvciA9IG9tZWdhKHQpOyByZXNwb25zZSA9IGRhaWx5IHByZXZhbGVuY2UodCkKCmBgYHtyfQoKYWxsX3ByZXZhbGVuY2UgPC0gc3RhdGVfc3VtbWFyaWVzICU+JQogIGZpbHRlcihwZXJpb2QgPT0gIlBhc3QiKSAlPiUKICBmaWx0ZXIodmFyaWFibGUgPT0gInByZXZhbGVuY2UiKSAlPiUKICBkcGx5cjo6c2VsZWN0KGxvY2F0aW9uLCBkYXRlLCBtZWFuX3ZhbHVlKSAlPiUKICByZW5hbWUocHJldmFsZW5jZSA9IG1lYW5fdmFsdWUpICU+JSAKICBmaWx0ZXIoZGF0ZSA8PSBTeXMuRGF0ZSgpKQoKbWVhbl9hbGxfcHJldmFsZW5jZSA8LSBhbGxfcHJldmFsZW5jZSAlPiUgZ3JvdXBfYnkoZGF0ZSkgJT4lIHN1bW1hcmlzZShwcmV2YWxlbmNlID0gbWVhbihwcmV2YWxlbmNlKSkKIyBwbG90KHggPSBtZWFuX29tZWdhJG1lYW5fdmFsdWUsIHkgPSBtZWFuX2FsbF9wcmV2YWxlbmNlJHByZXZhbGVuY2UpCgptZWFucyA8LSBtZWFuX3BoaSAlPiUgCiAgZnVsbF9qb2luKG1lYW5fcHNpKSAlPiUgCiAgZnVsbF9qb2luKG1lYW5fb21lZ2EpICU+JSAKICBmdWxsX2pvaW4obWVhbl9hbGxfcHJldmFsZW5jZSkKCnN0YXRlX3N1bW1hcmllc193aWRlIDwtIHN0YXRlX3N1bW1hcmllcyAlPiUKICBmaWx0ZXIocGVyaW9kID09ICJQYXN0IikgJT4lCiAgZmlsdGVyKHNpbV90eXBlID09ICdzdGF0dXNfcXVvJykgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwgdmFsdWVzX2Zyb20gPSBtZWFuX3ZhbHVlKSAlPiUgCiAgZ3JvdXBfYnkobG9jYXRpb24pICU+JSAKICBtdXRhdGUoQVVfb21lZ2EgPSBjdW1zdW0ob21lZ2EpKQoKQ0EgPC0gc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIGZpbHRlcihsb2NhdGlvbiA9PSAiQ2FsaWZvcm5pYSIpCgpsYWdmaWxsIDwtIGZ1bmN0aW9uKHgsIGxhZyxmaWxsPTEpIHsKICByZXBsYWNlX25hKGxhZyh4LGxhZyksZmlsbCkKfQoKQ0EgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKG9tZWdhLDApLCB5ID0gfnByZXZhbGVuY2UsIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkNhbGlmb3JuaWEiLHhheGlzPWxpc3QodGl0bGU9Im9tZWdhIikseWF4aXM9bGlzdCh0aXRsZT0icHJldmFsZW5jZSIpKQoKc3RhdGVfc3VtbWFyaWVzX3dpZGUgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKG9tZWdhLDApLCB5ID0gfnByZXZhbGVuY2UsIGNvbG9yID0gfmxvY2F0aW9uLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlLCAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uICkpICU+JSAKICAgIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkFsbCBzdGF0ZXMiLCB4YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpLHlheGlzPWxpc3QodGl0bGU9InByZXZhbGVuY2UiKSkKCm1lYW5zICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5vbWVnYSwgeSA9IH5wcmV2YWxlbmNlLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBPbWVnYTogJywgb21lZ2EsICc8L2JyPiBwcmV2YWxlbmNlOiAnLCBwcmV2YWxlbmNlLCAnPC9icj4gRGF0ZTogJywgZGF0ZSApKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiTWVhbiBvbWVnYSwgbWVhbiBwcmV2YWxlbmNlIChhY3Jvc3Mgc3RhdGVzKSIseGF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSx5YXhpcz1saXN0KHRpdGxlPSJwcmV2YWxlbmNlIikpCgpgYGAKCi0tLQoKQ2FsaWZvcm5pYSwgYW5kIG1lYW4gYWNyb3NzIHN0YXRlcywgYXQgdmFyeWluZyBsYWdzCgpgYGB7cn0KQ0EgJT4lIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwob21lZ2EsMCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMCIsCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSw3KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyA3IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwxNCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMTQiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDIxKSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAyMSIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMjgpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDI4IikgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkNhbGlmb3JuaWEsIG9tZWdhIGF0IHZhcnlpbmcgbGFncyIsIHhheGlzID0gbGlzdCh0aXRsZSA9ICJvbWVnYSIpKQoKbWVhbnMgJT4lIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwob21lZ2EsMCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMCIsCiAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIHRleHQgPSB+cGFzdGUoJzwvYnI+IE9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IHByZXZhbGVuY2U6ICcsIHByZXZhbGVuY2UsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSw3KSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyA3IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChvbWVnYSwxNCksIHkgPSB+cHJldmFsZW5jZSwgbmFtZSA9ICJsYWcgMTQiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKG9tZWdhLDIxKSwgeSA9IH5wcmV2YWxlbmNlLCBuYW1lID0gImxhZyAyMSIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwob21lZ2EsMjgpLCB5ID0gfnByZXZhbGVuY2UsIG5hbWUgPSAibGFnIDI4IikgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIk1lYW4gb21lZ2EsIG1lYW4gcHJldmFsZW5jZSAoYWNyb3NzIHN0YXRlcylcbm9tZWdhIGF0IHZhcnlpbmcgbGFncyIsIHhheGlzID0gbGlzdCh0aXRsZSA9ICJvbWVnYSIpKQoKYGBgCgotLS0KCmIpIHByZWRpY3RvciA9IEFVQyBvZiBvbWVnYSBvdmVyIHRpbWU7IHJlc3BvbnNlID0gY3VtdWxhdGl2ZSBhbGwgaW5mZWN0aW9ucyBvdmVyIHRpbWUKCmBgYHtyfQoKQ0EgJT4lIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMCksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICdsYWcgMCcsIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IEFyZWEgdW5kZXIgT21lZ2E6ICcsIEFVX29tZWdhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IEN1bXVsYXRpdmUgaW5mZWN0aW9uczogJywgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChBVV9vbWVnYSw3KSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyA3IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChBVV9vbWVnYSwxNCksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICJsYWcgMTQiKSAlPiUgCiAgcGxvdGx5OjphZGRfdHJhY2UoeCA9IH5sYWdmaWxsKEFVX29tZWdhLDIxKSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLCBuYW1lID0gImxhZyAyMSIpICU+JSAKICBwbG90bHk6OmFkZF90cmFjZSh4ID0gfmxhZ2ZpbGwoQVVfb21lZ2EsMjgpLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIG5hbWUgPSAibGFnIDI4IikgJT4lIAogIHBsb3RseTo6YWRkX3RyYWNlKHggPSB+bGFnZmlsbChBVV9vbWVnYSw1NiksIHkgPSB+Y3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgbmFtZSA9ICJsYWcgNTYiKSAlPiUgCiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ2FsaWZvcm5pYSwgYXJlYSB1bmRlciBvbWVnYSBhdCB2YXJ5aW5nIGxhZ3MiLHhheGlzPWxpc3QodGl0bGU9IkFyZWEgdW5kZXIgb21lZ2EiKSx5YXhpcz1saXN0KHRpdGxlPSJDdW11bGF0aXZlIGluZmVjdGlvbnMiKSkKCnN0YXRlX3N1bW1hcmllc193aWRlICU+JSBmaWx0ZXIocGVyaW9kID09ICdQYXN0JykgJT4lIAogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5sYWdmaWxsKEFVX29tZWdhLDApLCB5ID0gfmN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMsIGNvbG9yID0gfmxvY2F0aW9uLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IEFyZWEgdW5kZXIgT21lZ2E6ICcsIEFVX29tZWdhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IEN1bXVsYXRpdmUgaW5mZWN0aW9uczogJywgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2JyPiBEYXRlOiAnLCBkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9icj4gU3RhdGU6ICcsIGxvY2F0aW9uKSkgJT4lIAogICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQWxsIHN0YXRlcyIsIHhheGlzPWxpc3QodGl0bGU9IkFyZWEgdW5kZXIgb21lZ2EgKGxhZyAwKSIpLCB5YXhpcz1saXN0KHRpdGxlPSJDdW11bGF0aXZlIGluZmVjdGlvbnMiKSkKCgpgYGAKCi0tLQoKYykgcHJlZGljdG9yID0gQVVDIG9mIG9tZWdhOyByZXNwb25zZSA9IGN1bXVsYXRpdmUgYWxsIGluZmVjdGlvbnMKCmBgYHtyfQojIHN0YXRlX3N1bW1hcmllc193aWRlICU+JSAKIyAgIGZpbHRlcihwZXJpb2QgPT0gJ1Bhc3QnKSAlPiUKIyAgIGZpbHRlcihkYXRlID4gYnVybmluWzJdKSAlPiUKIyAgIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgCiMgICBzdW1tYXJpc2UoQVVfb21lZ2EgPSBtYXgoQVVfb21lZ2EpLCBjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zID0gbWF4KGN1bXVsYXRpdmVfYWxsX2luZmVjdGlvbnMpKSAlPiUgCiMgICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKIyAgICAgICAgICAgICAgICAgeCA9IH5BVV9vbWVnYSwgeSA9IH5jdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zLAojICAgICAgICAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsIAojICAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBBcmVhIHVuZGVyIE9tZWdhOiAnLCBBVV9vbWVnYSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IEN1bXVsYXRpdmUgaW5mZWN0aW9uczogJywgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucywgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnI+IFN0YXRlOiAnLCBsb2NhdGlvbikpICU+JSAKIyAgICAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSAiQ29ycmVsYXRpb24gb2YgY3VtdWxhdGl2ZSBpbmZlY3Rpb24gd2l0aCBBcmVhIHVuZGVyIG9tZWdhIiwgeGF4aXM9bGlzdCh0aXRsZT0iQXJlYSB1bmRlciBvbWVnYSIpLCB5YXhpcz1saXN0KHRpdGxlPSJDdW11bGF0aXZlIGluZmVjdGlvbnMiKSkKCnN0YXRlX3N1bW1hcmllc193aWRlICU+JSAKICBmaWx0ZXIocGVyaW9kID09ICdQYXN0JykgJT4lCiAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQogIGdyb3VwX2J5KGxvY2F0aW9uKSAlPiUgCiAgc3VtbWFyaXNlKEFVX29tZWdhID0gbWF4KEFVX29tZWdhKSwgY3VtdWxhdGl2ZV9hbGxfaW5mZWN0aW9ucyA9IG1heChjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zKSkgJT4lIAogIGdnc3RhdHNwbG90OjpnZ3NjYXR0ZXJzdGF0cyh4ID0gIkFVX29tZWdhIiwgeSA9ICJjdW11bGF0aXZlX2FsbF9pbmZlY3Rpb25zIiwgdHlwZSA9ICJzcGVhcm1hbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBjdW11bGF0aXZlIGluZmVjdGlvbnMgd2l0aCBBcmVhIHVuZGVyIG9tZWdhIikKCmBgYAoKLS0tCgplKSBtYXAgb2Ygc2FtZSAoY29ycmVsYXRpb24sIGJ5IHN0YXRlKQoKVG8gYmUgbWFkZQoKIyBDb3JyZWxhdGlvbiBiZXR3ZWVuIE1vYmlsaXR5IGFuZCBPbWVnYQoKYGBge3J9CgpDQSAlPiUgCiAgcGxvdGx5OjpwbG90X2x5KHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbWFya2VycycsCiAgICAgICAgICAgICAgICB4ID0gfm1vYmlsaXR5X3RyZW5kLCB5ID0gfm9tZWdhLCAKICAgICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywgCiAgICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCc8L2JyPiBNb2JpbGl0eTogJywgbW9iaWxpdHlfdHJlbmQsICc8L2JyPiBvbWVnYTogJywgb21lZ2EsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIkNhbGlmb3JuaWEiLHhheGlzPWxpc3QodGl0bGU9Im1vYmlsaXR5IHRyZW5kIikseWF4aXM9bGlzdCh0aXRsZT0ib21lZ2EiKSkKCkNBICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQogIHNlbGVjdChkYXRlLG1vYmlsaXR5X3RyZW5kLG9tZWdhKSAlPiUgCiAgZ2dzdGF0c3Bsb3Q6Omdnc2NhdHRlcnN0YXRzKHggPSAibW9iaWxpdHlfdHJlbmQiLCB5ID0gIm9tZWdhIiwgdHlwZSA9ICJzcGVhcm1hbiIsIHRpdGxlID0gIkNhbGlmb3JuaWEiKQoKCnN0YXRlX3N1bW1hcmllc193aWRlICU+JSAKICBwbG90bHk6OnBsb3RfbHkodHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdtYXJrZXJzJywKICAgICAgICAgICAgICAgIHggPSB+bW9iaWxpdHlfdHJlbmQsIHkgPSB+b21lZ2EsIGNvbG9yID0gfmxvY2F0aW9uLAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE1vYmlsaXR5OiAnLCBtb2JpbGl0eV90cmVuZCwgJzwvYnI+IG9tZWdhOiAnLCBvbWVnYSwgJzwvYnI+IERhdGU6ICcsIGRhdGUsICc8L2JyPiBTdGF0ZTogJywgbG9jYXRpb24gKSkgJT4lCiAgICBwbG90bHk6OmxheW91dCh0aXRsZSA9ICJBbGwgc3RhdGVzIiwgeGF4aXM9bGlzdCh0aXRsZT0ibW9iaWxpdHkgdHJlbmQiKSx5YXhpcz1saXN0KHRpdGxlPSJvbWVnYSIpKQoKbWVhbnMgJT4lIAogIGZpbHRlcihkYXRlIDwgZnV0dXJlWzFdKSAlPiUgCiAgZmlsdGVyKGRhdGUgPiBhcy5EYXRlKCIyMDIwLTAyLTI1IikpICU+JSAjIEZlYiAyNiBpcyB0aGUgZmlyc3QgZGF5IHdpdGggYW55IG1vYmlsaXR5IDwgMQogIHBsb3RseTo6cGxvdF9seSh0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ21hcmtlcnMnLAogICAgICAgICAgICAgICAgeCA9IH5waGksIHkgPSB+b21lZ2EsICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaG92ZXJpbmZvID0gJ3RleHQnLCAKICAgICAgICAgICAgICAgIHRleHQgPSB+cGFzdGUoJzwvYnI+IE1vYmlsaXR5OiAnLCBwaGksICc8L2JyPiBvbWVnYTogJywgb21lZ2EsICc8L2JyPiBEYXRlOiAnLCBkYXRlKSkgJT4lIAogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gIk1lYW4gbW9iaWxpdHksIG1lYW4gb21lZ2EgKGFjcm9zcyBzdGF0ZXMpIix4YXhpcz1saXN0KHRpdGxlPSJtb2JpbGl0eSB0cmVuZCIpLHlheGlzPWxpc3QodGl0bGU9Im9tZWdhIikpCgpgYGAKCmBgYHtyfQojIG1lYW5zICU+JSBmaWx0ZXIoZGF0ZSA8IGZ1dHVyZVsxXSkgJT4lIAojICAgZmlsdGVyKGRhdGUgPiBidXJuaW5bMl0pICU+JQojICAgZ2dzY2F0dGVyaGlzdCh4ID0gInBoaSIsIHkgPSAib21lZ2EiLCAKIyAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIHNoYXBlID0gMTksIHNpemUgPSAzLCAjIHBvaW50cwojICAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCAKIyAgICAgICAgICAgYWRkLnBhcmFtcyA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAibGlnaHRncmF5IiksCiMgICAgICAgICAgIGNvbmYuaW50ID0gVFJVRSwgCiMgICAgICAgICAgIGNvci5jb2VmID0gVFJVRSwgY29yLm1ldGhvZCA9ICJzcGVhcm1hbiIsCiMgICAgICAgICAgIHhsYWIgPSAibW9iaWxpdHkgdHJlbmQiLCB5bGFiID0gIm9tZWdhIiwKIyAgICAgICAgICAgbWFyZ2luLnBsb3QgPSAiZGVuc2l0eSIsCiMgICAgICAgICAgIG1hcmdpbi5nZ3RoZW1lID0gdGhlbWVfdm9pZCgpLAojICAgICAgICAgICBtYXJnaW4uc3BhY2UgPSBGQUxTRSwKIyAgICAgICAgICAgbWFpbi5wbG90LnNpemUgPSAyLAojICAgICAgICAgICBtYXJnaW4ucGxvdC5zaXplID0gMQojICAgICAgICAgICApCgptZWFucyAlPiUgZmlsdGVyKGRhdGUgPCBmdXR1cmVbMV0pICU+JSAKICBmaWx0ZXIoZGF0ZSA+IGJ1cm5pblsyXSkgJT4lCiAgZ2dzdGF0c3Bsb3Q6Omdnc2NhdHRlcnN0YXRzKHggPSAicGhpIiwgeSA9ICJvbWVnYSIsIHR5cGUgPSAic3BlYXJtYW4iLCB0aXRsZSA9ICJNZWFuIHBoaSwgTWVhbiBvbWVnYSBvdmVyIGFsbCBzdGF0ZXMiKQoKCmBgYAoK